/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package dao.Pedido;

import dao.Item.ItemDao;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import pojo.Item;
import pojo.Pedido;
import util.SplitStringToNumberArray;

/**
 *
 * @author Andre Luiz
 */
public class PedidoDaoImpl implements PedidoDao {

    private final Collection<Pedido> pedidos;

    public PedidoDaoImpl() {
        this.pedidos = new ArrayList<>();
    }

    @Override
    public boolean salvar(Pedido pedido) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("smConfeccoesPU");
        EntityManager em = emf.createEntityManager ();
        try{
            em.getTransaction().begin();
            em.persist(pedido);
            em.getTransaction().commit();
            em.close();
            emf.close();
        }catch (RuntimeException e) {
            return false;
        }
        return true;
    }

    @Override
    public ArrayList<Pedido> buscarPorId(ArrayList<Long> idPedido) {
        Pedido pedidoTemp;
        ArrayList<Pedido> arrayPedidoTemp = new ArrayList<Pedido>();
        for (long pedidoIterator : idPedido) {
            pedidoTemp = new Pedido();
            pedidoTemp.setId(pedidoIterator);
            pedidoTemp = this.buscar(pedidoTemp);
            /*certificando que somente pedidos abertos sejam listados
            afinal de contas os pedidos fechados viram nota fiscal.
            */
            if (pedidoTemp.getEstado() == 0) {
                arrayPedidoTemp.add(pedidoTemp);
            }
        }
        return arrayPedidoTemp;
    }

    @Override
    //retorna uma lista de pedidos selecionados por id
    public Collection<Pedido> listar() {
        return this.pedidos;
    }

    //modificar, vai virar buscaPorEstado
    @Override
    public ArrayList<Pedido> listarEstado() {
        return (ArrayList<Pedido>) pedidos;
    }

    @Override
    public boolean remover(Pedido pedido) {
        return false;
    }

    @Override
    public Pedido buscar(Pedido pedido) {
        Pedido pedidoTemp;
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("smConfeccoesPU");
        EntityManager em = emf.createEntityManager ();
        try{
            em.getTransaction().begin();
            pedidoTemp = em.find(pedido.getClass(),pedido.getId());
            em.getTransaction().commit();
            em.close();
            emf.close();
        }catch (IllegalArgumentException e) {
            return null;
        }
        return pedidoTemp;
    }

    @Override
    public boolean carregarDisco(ItemDao itemDao) {
        Pedido pedido;
        String itens;
        Item item;
        File arquivo = new File("registroPedidos");
        if (!arquivo.exists()) {
            return false;
        }
        FileReader reader;
        BufferedReader leitor;
        try {
            reader = new FileReader(arquivo);
            leitor = new BufferedReader(reader);
            while (leitor.ready()) {
                pedido = new Pedido();
                pedido.setId(Long.parseLong(leitor.readLine()));
                pedido.setEstado(Integer.parseInt(leitor.readLine()));
                pedido.setNotaFiscal(Long.parseLong(leitor.readLine()));
                pedido.setCliente(Long.parseLong(leitor.readLine()));
                itens = leitor.readLine();
                //pedido.setItens(splitStringToLongArray.convert(itens));
                ArrayList<Long> itensTemp = SplitStringToNumberArray.convertLong(itens);
                itens = leitor.readLine();
                ArrayList<Integer> quantidadesTemp = SplitStringToNumberArray.convertInt(itens);
                //itens = leitor.readLine();

                for (int i = 0; i < itensTemp.size(); i++) {
                    item = new Item();
                    item.setId(itensTemp.get(i));
                    Item itemTemp = itemDao.buscarPorId(item);
                    item.setNome(itemTemp.getNome());
                    item.setQuantidade(quantidadesTemp.get(i));
                    pedido.setItens(item);
                }

                //pedido.setQuantidades(splitStringToLongArray.convertInt(itens));
                this.salvar(pedido);
                leitor.readLine();
            }
            reader.close();
            leitor.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(PedidoDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(PedidoDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return true;
    }

    @Override
    public boolean salvarDisco() {
        if (pedidos == null) {
            return false;
        }
        try {
            FileWriter writer = new FileWriter("registroPedidos");
            PrintWriter saida = new PrintWriter(writer);
            for (Pedido pedidosIterator : pedidos) {
                saida.println(pedidosIterator.getId());
                saida.println(pedidosIterator.getEstado());
                saida.println(pedidosIterator.getNotaFiscal());
                saida.println(pedidosIterator.getClientes());
                if (pedidosIterator.getItens().isEmpty()) {
                    saida.print('#');
                } else {
                    for (Item iteratorItens : pedidosIterator.getItens()) {
                        saida.print(iteratorItens.getId());
                        saida.print('#');
                    }
                }
                saida.println();
                if (pedidosIterator.getItens().isEmpty()) {
                    saida.print('#');
                } else {
                    for (Item iteratorItens : pedidosIterator.getItens()) {
                        saida.print(iteratorItens.getQuantidade());
                        saida.print('#');
                    }
                }
                saida.println("\n");
            }
            writer.close();
            saida.close();
        } catch (IOException e) {
            System.out.println(e.toString());
            return false;
        }
        return true;
    }
}
